' Written by Craig'n'Dave
Module Module1
    ' Quicksort using a variation of the Lomuto partition scheme
    Function quicksort(items As List(Of String))
        ' A single item does not need sorting
        If items.Count <= 1 Then
            Return items
        Else
            ' Set the pointer position and pivot To be the last item
            Dim pointer As Integer = 0
            Dim pivot = items.Count - 1
            Dim pivot_value As String = items(items.Count - 1)
            Dim temp As String
            Dim temp_pointer As Integer
            ' Partitioning step
            Do While pointer <> pivot
                ' Put pivot item in position
                If (items(pointer) > items(pivot) And pointer < pivot) Or (items(pointer) < items(pivot) And pointer > pivot) Then
                    temp = items(pointer)
                    items(pointer) = items(pivot)
                    items(pivot) = temp
                    temp_pointer = pointer
                    pointer = pivot
                    pivot = temp_pointer
                End If
                ' Move the pointer
                If pointer < pivot Then
                    pointer = pointer + 1
                Else
                    pointer = pointer - 1
                End If
            Loop

            ' Divide and conquer left and right of the pivot
            Dim new_list As New List(Of String)
            new_list.AddRange(quicksort(items.GetRange(0, pointer)))
            new_list.Add(items(pointer))
            new_list.AddRange(quicksort(items.GetRange(pointer + 1, items.Count() - 1 - pointer)))
            Return new_list
        End If
    End Function

    'Main algorithm starts here
    Sub Main()
        Dim items As New List(Of String) From {"Florida", "Georgia", "Delaware", "Alabama", "California"}
        items = quicksort(items)
        Console.WriteLine(String.Join(", ", items))
    End Sub
End Module
